package com.server.tools;

import com.server.tools.http_exception.BusinessException;
import io.jsonwebtoken.*;
import org.springframework.data.mongodb.core.query.Criteria;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;

public class JWTTools {

    // 密钥记得给长一点并且复杂一点,至少不能比这里短否则会报密钥为空的错误
    private static final String jwtKey="123@^_^@321";

    /**
     * 生成token并返回
     * @param uid 对应账号uid
     * @return token
     */
    public static  String createToken(Long uid){
        // 将uid写入map集合
        Map<String,Object> claims =new HashMap<>();
        claims.put("uid",uid);
        // 创建jwt构建器
        JwtBuilder jwtBuilder = Jwts.builder()
                // 写入密钥和选择的算法
                .signWith(SignatureAlgorithm.HS256,jwtKey)
                .setClaims(claims) // 写入数据体内容
                .setIssuedAt(new Date()) // 设置签发时间为当前时间内
                // 设置过期时间为7天后
                .setExpiration(new Date(System.currentTimeMillis()+7*24*60*60*1000));
        return jwtBuilder.compact(); // 调用compact方法生成并返回token字符串
    }

    /**
     * 解析token
     * @param token 收到的token
     * @return 解析结果
     */
    public static Map<String,Object> checkToken(String token){
        Claims claims;
        try{
            // 尝试解析token,如果正常解析则返回body。解析失败则返回null
            claims = (Claims) Jwts.parser().setSigningKey(jwtKey).parse(token).getBody();
        }catch (Exception e){
            throw new BusinessException(e.getMessage(),Code.TOKEN_ERR);
        }
        return claims;
    }
    /**
     * 解析token中的uid
     * @param token 收到的token
     * @return 解析结果
     */
    public static Long getTokenUid(String token){
        Map<String, Object> map = checkToken(token);
        if(map==null || !map.containsKey("uid")){
            throw new BusinessException("Token中的uid异常", Code.TOKEN_ERR);
        }
        return Long.valueOf((Integer) map.get("uid"));
    }


}
